home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
QRZ! Ham Radio 8
/
QRZ Ham Radio Callsign Database - Volume 8.iso
/
pc
/
files
/
t_unix
/
j109lxa4.tar
/
mboxcmd.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-06-04
|
31KB
|
1,453 lines
/* NOTE: because of size, the previous 'mailbox.c' has been
* split in 3 parts:
* mboxcmd.c, containing the 'mbox' subcommands,
* mailbox.c, containing some user mailbox commands, and
* mailbox2.c, containing the remaining user commands.
* 921125 - WG7J
*/
/* There are only two functions in this mailbox code that depend on the
* underlying protocol, namely mbx_getname() and dochat(). All the other
* functions can hopefully be used without modification on other stream
* oriented protocols than AX.25 or NET/ROM.
*
* SM0RGV 890506, most work done previously by W9NK
*
*** Changed 900114 by KA9Q to use newline mapping features in stream socket
* interface code; everything here uses C eol convention (\n)
*
* Numerous new commands and other changes by SM0RGV, 900120
*
* Gateway function now support outgoing connects with the user's call
* with inverted ssid. Users can connect to system alias as well...
* See also several mods in socket.c,ax25.c and others
* 11/15/91, WG7J/PA3DIS
*
* Userlogging, RM,VM and KM commands, and R:-line interpretation
* added 920307 and later, Johan. K. Reinalda, WG7J/PA3DIS
*
* Inactivity timeout-disconnect added 920325 and later - WG7J
*
*/
#include <stdio.h>
#ifdef MSDOS
#include <io.h>
#endif
#include <time.h>
#include <ctype.h>
#ifdef MSDOS
#include <alloc.h>
#endif
#include <stdlib.h>
#include <string.h>
#include <time.h>
#ifdef UNIX
#include <sys/types.h>
#include <sys/stat.h>
#endif
#ifdef MSDOS
#include <dir.h>
#include <dos.h>
#endif
#include "global.h"
#include "config.h"
#include "timer.h"
#include "proc.h"
#include "socket.h"
#include "usock.h"
#include "session.h"
#include "smtp.h"
#include "dirutil.h"
#include "telnet.h"
#include "ftp.h"
#include "ftpserv.h"
#include "commands.h"
#include "netuser.h"
#include "files.h"
#include "bm.h"
#include "pktdrvr.h"
#include "ax25.h"
#include "mailbox.h"
#include "ax25mail.h"
#include "nr4mail.h"
#include "cmdparse.h"
#include "mailfor.h"
#ifdef MAILBOX
/*
#define MBDEBUG
*/
extern int dombmovemail __ARGS((int argc,char *argv[],void *p));
extern char Myalias[];
extern struct mbx *Mbox;
extern int BbsUsers;
extern int Totallogins;
char *Mtmsg;
int MAttended = 0;
unsigned Maxlet = BM_NLET;
char Mbpasswd[MAXPWDLEN+1] = "";
struct no_js *Exclude = (struct no_js *)NULL;
#ifdef MBFWD
char *Mbzip = NULLCHAR;
char *Mbqth = NULLCHAR;
char *Mbhaddress = NULLCHAR;
char *Mbfwdinfo = NULLCHAR;
int Mbsmtptoo = 0;
int Mtrace = 0;
#endif
extern int MbSent;
extern int MbRead;
extern int MbRecvd;
#ifdef MBFWD
extern int MbForwarded;
#endif
#ifdef AX25
static char Uplink[] = "Uplink (%s)";
static char Downlink[] = "Downlink (%s)";
#endif
#ifdef NETROM
static char incircuit[] = "Circuit (%s%s%s %s)";
static char outcircuit[] = "Circuit (%s%s%s)";
#endif
static char Telnet[] = "Telnet (%s @ %s)";
static char Telnetdown[] = "Telnet (%s)";
static char Local[] = "Local (%s)";
static int doattend __ARGS((int argc,char *argv[],void *p));
static int domaxmsg __ARGS((int argc,char *argv[],void *p));
/*static int dotimeout __ARGS((int argc,char *argv[],void *p));*/
int dombusers __ARGS((int argc,char *argv[],void *p));
static int dombpast __ARGS((int argc,char *argv[],void *p));
/*static int doarea __ARGS((int argc,char *argv[],void *p));*/
static int dojumpstart __ARGS((int argc,char *argv[],void *p));
static int dombnrid __ARGS((int argc,char *argv[],void *p));
static int dombpasswd __ARGS((int argc,char *argv[],void *p));
static int dombsecure __ARGS((int argc,char *argv[],void *p));
static int dombtrace __ARGS((int argc,char *argv[],void *p));
static int dombzipcode __ARGS((int argc,char *argv[],void *p));
static int dombfwdinfo __ARGS((int argc,char *argv[],void *p));
static int dombqth __ARGS((int argc,char *argv[],void *p));
static int dombhaddress __ARGS((int argc,char *argv[],void *p));
static int dombsmtptoo __ARGS((int argc,char *argv[],void *p));
static int dombutc __ARGS((int argc,char *argv[],void *p));
extern int dombmailfor __ARGS((int argc,char *argv[],void *p));
extern int dombstatus __ARGS((int argc,char *argv[],void *p));
static int dombmailstats __ARGS((int argc,char *argv[],void *p));
static int dombtdisc __ARGS((int argc,char *argv[],void *p));
static int dombtmsg __ARGS((int argc,char *argv[],void *p));
static int dombconvers __ARGS((int argc,char *argv[],void *p));
/*static int dombloophold __ARGS((int argc,char *argv[],void *p));*/
static int dombsendquery __ARGS((int argc,char *argv[],void *p));
static int dombmport __ARGS((int argc,char *argv[],void *p));
static int dombnewmail __ARGS((int argc,char *argv[],void *p));
static int dombhideport __ARGS((int argc,char *argv[],void *p));
static int dombheader __ARGS((int argc,char *argv[],void *p));
static int dombnobid __ARGS((int argc,char *argv[],void *p));
static int dombnoax25 __ARGS((int argc,char *argv[],void *p));
static int dombbonly __ARGS((int argc,char *argv[],void *p));
static int dombuonly __ARGS((int argc,char *argv[],void *p));
static int dombsonly __ARGS((int argc,char *argv[],void *p));
static struct pu *pu_lookup __ARGS((char *name));
void updatedefaults __ARGS((struct mbx *m));
int Mbjumpstart = 1;
int Usenrid;
int MBSecure;
#ifdef MAILCMDS
int Mbsendquery = 1;
int NoBid;
#ifdef USERLOG
int Mbnewmail = 1;
#endif
#endif
#ifdef MBXTDISC
int32 Mbtdiscinit;
#endif
/* mbox subcommand table */
static struct cmds Mbtab[] = {
"attend", doattend, 0, 0, NULLCHAR,
#ifdef CONVERS
"convers", dombconvers,0, 0, NULLCHAR,
#endif
#ifdef MAILCMDS
#ifdef MBFWD
"fwdinfo", dombfwdinfo,0, 0, NULLCHAR,
"haddress", dombhaddress,0,0, NULLCHAR,
"header", dombheader, 0, 0, NULLCHAR,
#endif
#endif
#ifdef AX25
"hideport", dombhideport, 0,0, NULLCHAR,
"jumpstart", dojumpstart,0, 0, NULLCHAR,
#ifdef MAILCMDS
#ifdef MBFWD
#ifdef RLINE
"kick", dombkick, 0, 0, NULLCHAR,
#endif
#endif
#endif
#endif
#ifdef MAILCMDS
#ifdef MAILFOR
#ifdef AX25
"mailfor", dombmailfor,0, 0, NULLCHAR,
#endif
#endif
"maxmsg", domaxmsg, 0, 0, NULLCHAR,
#ifdef AX25
"mport", dombmport, 0, 0, NULLCHAR,
#ifdef USERLOG
"newmail", dombnewmail,0, 0, NULLCHAR,
#endif
#endif /* MAILCMDS */
"nobid", dombnobid, 0, 0, NULLCHAR,
"nrid", dombnrid, 0, 0, NULLCHAR,
#endif
"past", dombpast, 0, 0, NULLCHAR,
"password", dombpasswd, 0, 0, NULLCHAR,
#ifdef MAILCMDS
"mailstats",dombmailstats,0,0,NULLCHAR,
#ifdef MBFWD
"qth", dombqth, 0, 0, NULLCHAR,
#endif
#endif /* MAILCMDS */
"secure", dombsecure, 0, 0, NULLCHAR,
#ifdef MAILCMDS
"sendquery",dombsendquery,0,0,NULLCHAR,
#ifdef MBFWD
"smtptoo", dombsmtptoo,0, 0, NULLCHAR,
#endif
#endif
"status", dombstatus, 0, 0, NULLCHAR,
#ifdef MAILCMDS
#ifdef AX25
#ifdef MBFWD
"timer", dombtimer, 0, 0, NULLCHAR,
#endif
#endif
#endif
#ifdef MBXTDISC
"tdisc", dombtdisc, 0, 0, NULLCHAR,
#endif
"tmsg", dombtmsg, 0, 0, NULLCHAR,
#ifdef MAILCMDS
#ifdef MBFWD
"trace", dombtrace, 0, 0, NULLCHAR,
"utc", dombutc, 0, 0, NULLCHAR,
"zipcode", dombzipcode,0, 0, NULLCHAR,
#endif
#endif
"noax25", dombnoax25, 0, 0, NULLCHAR,
"bbsonly", dombbonly, 0, 0, NULLCHAR,
"usersonly",dombuonly, 0, 0, NULLCHAR,
"sysoponly",dombsonly, 0, 0, NULLCHAR,
NULLCHAR,
};
char Mbnrid[20];
/*set the mailbox netrom id*/
void
setmbnrid() {
char tmp[AXBUF];
char tmp2[AXBUF];
#ifndef AX25
char *cp;
#endif
#ifdef NETROM
if(Nr_iface != NULLIF) { /* Use netrom call, and alias (if exists) */
if(*Myalias != '\0')
sprintf(Mbnrid,"%s:%s ",pax25(tmp,Myalias),
pax25(tmp2,Nr_iface->hwaddr));
else
sprintf(Mbnrid,"%s ",pax25(tmp,Nr_iface->hwaddr));
return;
}
/* Use Mycall, and alias (if exists) */
if(*Myalias != '\0')
sprintf(Mbnrid,"%s:%s ",pax25(tmp,Myalias),pax25(tmp2,Mycall));
else
#endif
#ifdef AX25
sprintf(Mbnrid,"%s ",pax25(tmp,Mycall));
#else
strncpy(Mbnrid,Hostname,19);
if((cp = strchr(Mbnrid,'.')) != NULLCHAR)
*cp = '\0';
#endif
return;
}
/*This is a dummy called from the main command interpreter,
*setup a mbx structure so dombusers() works correct - WG7J
*/
int
dombstatus(argc,argv,p)
int argc;
char *argv[];
void *p;
{
struct mbx m;
m.privs = SYSOP_CMD;
m.stype = ' ';
return dombusers(0,NULL,&m);
}
int
dombox(argc,argv,p)
int argc;
char *argv[];
void *p;
{
if(argc == 1)
return dombstatus(0,NULL,NULL);
return subcmd(Mbtab,argc,argv,p);
}
#ifdef AX25
static int
dombhideport(int argc, char *argv[], void *p)
{
return setflag(argc,argv[1],HIDE_PORT,argv[2]);
}
static int
dojumpstart(argc,argv,p)
int argc;
char *argv[];
void *p;
{
register int i;
char tmp[AXBUF];
struct no_js *ep;
if(*argv[1] == 'e') {
/*the exclude subcommand*/
if(argc == 2) { /*just list them*/
for(ep=Exclude;ep!=(struct no_js *)NULL;ep=ep->next)
tprintf("%s ",pax25(tmp,ep->call));
tputc('\n');
} else { /*add some call(s)*/
for(i=0;i<argc-2;i++) {
ep = callocw(1,sizeof(struct no_js));
if(setcall(ep->call,argv[i+2]) == -1){
tprintf("Invalid call: %s\n",argv[i+2]);
free(ep);
} else { /* add to list */
ep->next = Exclude;
Exclude = ep;
}
}
}
return 0;
}
return setbool(&Mbjumpstart,"Jump start on connect",argc,argv);
}
static int
dombnrid(argc,argv,p)
int argc;
char *argv[];
void *p;
{
return setbool(&Usenrid,"Netrom id prompt",argc,argv);
}
#ifdef MAILCMDS
static int
dombmport(argc,argv,p)
int argc;
char *argv[];
void *p;
{
return setflag(argc,argv[1],MAIL_BEACON,argv[2]);
}
#endif
#endif /* AX25 */
#ifdef MAILCMDS
static int
dombnobid(argc,argv,p)
int argc;
char *argv[];
void *p;
{
return setbool(&NoBid,"Accept Buls without BID",argc,argv);
}
static int
dombsendquery(argc,argv,p)
int argc;
char *argv[];
void *p;
{
return setbool(&Mbsendquery,"query after send",argc,argv);
}
#ifdef USERLOG
static int
dombnewmail(argc,argv,p)
int argc;
char *argv[];
void *p;
{
return setbool(&Mbnewmail,"show new area mail",argc,argv);
}
#endif
#endif
#ifdef CONVERS
int Mbconverse = 1;
static int
dombconvers(argc,argv,p)
int argc;
char *argv[];
void *p;
{
return setbool(&Mbconverse,"Mbox convers",argc,argv);
}
#endif
/* if unattended mode is set, ax25, telnet and maybe other sessions will
* be restricted.
*/
static int
doattend(argc,argv,p)
int argc;
char *argv[];
void *p;
{
return setbool(&MAttended,"Mailbox Attended flag",argc,argv);
}
#ifdef MAILCMDS
static int
domaxmsg(argc,argv,p)
int argc;
char *argv[];
void *p;
{
return setuns(&Maxlet,"Maximum messages per area",argc,argv);
}
#endif
#ifdef MBXTDISC
/* Set mailbox redundancy timer */
static int
dombtdisc(argc,argv,p)
int argc;
char *argv[];
void *p;
{
return setlong(&Mbtdiscinit,"Mbox redundancy timer (sec)",argc,argv);
}
#endif
#ifdef MAILCMDS
#ifdef MBFWD
int Mbheader;
extern int ThirdParty;
static int
dombheader(argc,argv,p)
int argc;
char *argv[];
void *p;
{
int retval;
retval = setbool(&Mbheader,"R: header",argc,argv);
if(!Mbheader)
ThirdParty = 0;
return retval;
}
static int
dombsmtptoo(argc,argv,p)
int argc;
char *argv[];
void *p;
{
return setbool(&Mbsmtptoo,"Bbs forwards SMTP headers",argc,argv);
}
#endif
#endif
static int
dombpasswd(argc,argv,p)
int argc;
char *argv[];
void *p;
{
int len;
/*Only allowed from keyboard*/
if(Curproc->input != Command->input) {
tputs(Noperm);
return 0;
}
if(argc != 2) {
tputs("Usage: mbox password \"<sysop password>\"\n");
return 0;
}
if((len=strlen(argv[1])) == 0)
return 0; /* zero length, don't reset */
if(len > MAXPWDLEN) {
tputs("Too long\n");
return 0;
}
strcpy(Mbpasswd,argv[1]);
return 0;
}
static int
dombtmsg(argc,argv,p)
int argc;
char *argv[];
void *p;
{
if(argc > 2) {
tputs("Usage: mbox tmsgs \"<your message>\"\n");
return 0;
}
if(argc < 2) {
if(Mtmsg != NULLCHAR)
tputs(Mtmsg);
}
else {
if(Mtmsg != NULLCHAR){
free(Mtmsg);
Mtmsg = NULLCHAR; /* reset the pointer */
}
if(!strlen(argv[1]))
return 0; /* clearing the buffer */
Mtmsg = mallocw(strlen(argv[1])+5);/* allow for the EOL char */
strcpy(Mtmsg, argv[1]);
strcat(Mtmsg, "\n"); /* add the EOL char */
}
return 0;
}
#ifdef MAILCMDS
#ifdef MBFWD
signed int UtcOffset=0;
/*Set the difference between Local time, and UTC !*/
static int
dombutc(argc,argv,p)
int argc;
char *argv[];
void *p;
{
if(argc < 2) {
tputs("Local Time is UTC");
if(UtcOffset == 0)
tputc('\n');
else {
if(UtcOffset > 0)
tputc('+');
tprintf("%d\n",UtcOffset);
}
return 0;
}
UtcOffset = atoi(argv[1]);
return 0;
}
/*Set the ZIP to be used in the R: line when forwarding */
static int
dombzipcode(argc,argv,p)
int argc;
char *argv[];
void *p;
{
int len;
if(argc > 2) {
tputs("Usage: mbox zipcode <your zip>\n");
return 0;
}
if(argc < 2) {
if(Mbzip != NULLCHAR)
tprintf("%s\n",Mbzip);
}
else {
len = strlen(argv[1]);
#ifdef notdef
/*check for a valid zip - this is for USA only!!! - WG7J*/
if( (len != 5) || !(atol(argv[1])) ){
tprintf("%s: Invalid, should be 5 digits!\n",argv[1]);
return 0;
}
#endif
if(Mbzip != NULLCHAR){
free(Mbzip);
Mbzip = NULLCHAR; /* reset the pointer */
}
if(len == 0)
return 0; /* clearing the buffer */
Mbzip = mallocw((unsigned)len+1); /* room for \0 */
strcpy(Mbzip, argv[1]);
}
return 0;
}
/* Set the QTH to be used in R: line when forwarding*/
static int
dombqth(argc,argv,p)
int argc;
char *argv[];
void *p;
{
if(argc > 2) {
tputs("Usage: mbox qth <your qth> || \"<your qth, state>\"\n");
return 0;
}
if(argc < 2) {
if(Mbqth != NULLCHAR)
tprintf("%s\n",Mbqth);
}
else {
if(Mbqth != NULLCHAR){
free(Mbqth);
Mbqth = NULLCHAR; /* reset the pointer */
}
if(!strlen(argv[1]))
return 0; /* clearing the buffer */
Mbqth = mallocw(strlen(argv[1]) + 1);
strcpy(Mbqth, argv[1]);
}
return 0;
}
/*Set the hierachical address to be used in R: line when forwarding*/
static int
dombhaddress(argc,argv,p)
int argc;
char *argv[];
void *p;
{
if(argc > 2) {
tputs("Usage: mbox haddress <your H-address (WITH call)>\n");
return 0;
}
if(argc < 2) {
if(Mbhaddress != NULLCHAR)
tprintf("%s\n",Mbhaddress);
}
else {
if(Mbhaddress != NULLCHAR){
free(Mbhaddress);
Mbhaddress = NULLCHAR; /* reset the pointer */
}
if(!strlen(argv[1]))
return 0; /* clearing the buffer */
Mbhaddress = mallocw(strlen(argv[1]) + 1);
strcpy(Mbhaddress, argv[1]);
/*make sure the're upper case*/
strupr(Mbhaddress);
}
return 0;
}
/*Set the R: line [info] to be used when forwarding*/
static int
dombfwdinfo(argc,argv,p)
int argc;
char *argv[];
void *p;
{
if(argc > 2) {
tputs("Usage: mbox fwdinfo \"<your R:-line [info]>\"\n");
return 0;
}
if(argc < 2) {
if(Mbfwdinfo != NULLCHAR)
tprintf("%s\n",Mbfwdinfo);
}
else {
if(Mbfwdinfo != NULLCHAR){
free(Mbfwdinfo);
Mbfwdinfo = NULLCHAR; /* reset the pointer */
}
if(!strlen(argv[1]))
return 0; /* clearing the buffer */
Mbfwdinfo = mallocw(strlen(argv[1]) + 1);
strcpy(Mbfwdinfo, argv[1]);
}
return 0;
}
#endif /*MBFWD*/
#endif
/* Keep track of all past users */
struct pu {
struct pu *next; /* next one in list */
char name[20]; /* user name */
#ifdef notdef
int family; /* how did user come in last */
#endif
int32 time; /* When was the last login ? */
int number; /* Number of times logged in */
};
#define NULLPU (struct pu *)NULL
struct pu *Pu = NULLPU;
/* Look up an entry in the users-list*/
static
struct pu *
pu_lookup(name)
char *name;
{
register struct pu *ppu;
struct pu *pulast = NULLPU;
for(ppu = Pu;ppu != NULLPU;pulast = ppu,ppu = ppu->next){
if(!strcmp(name,ppu->name)){ /* found it! */
if(pulast != NULLPU){
/* Move entry to top of list */
pulast->next = ppu->next;
ppu->next = Pu;
Pu = ppu;
}
return ppu;
}
}
return NULLPU;
}
/*Log all users of the mailbox*/
/* This gets kept track of in the file name UDefaults */
/* format is
user datestamp options
where options are separated by spaces
M# - use more with # lines
A - use area indiation
X - use expert status
N - use netrom lookalike prompt
*/
#ifdef USERLOG
/* Write the new defaults - WG7J */
void
#ifdef PROTOTYPES
updatedefaults(struct mbx *m)
#else
updatedefaults(m)
struct mbx *m;
#endif
{
FILE *Ufile, *tfile;
char buf[256];
char *cp;
time_t t;
/* Save old defaults file to backup */
unlink(UDefbak);
if(rename(UDefaults,UDefbak))
return;
/*Write all users back, but update this one!*/
if((Ufile = fopen(UDefaults,"w")) == NULLFILE)
/* Can't create defaults file ???*/
return;
if((tfile = fopen(UDefbak,"r")) == NULLFILE) {
/* What on earth happened ???? */
fclose(Ufile);
return;
}
while(fgets(buf,sizeof(buf),tfile) != NULLCHAR) {
if((cp=strchr(buf,' ')) != NULLCHAR)
*cp = '\0';
if(!stricmp(m->name,buf)) {
/*found this user*/
time(&t);
sprintf(buf,"%s %lu M%d %c %c %c C%c\n",
m->name,t,m->morerows,
(m->sid&MBX_AREA) ? 'A' : ' ' ,
(m->sid&MBX_EXPERT) ? 'X' : ' ' ,
(m->sid&MBX_NRID) ? 'N' : ' ',
(m->family == AF_AX25) ? 'A' : \
((m->family == AF_NETROM) ? 'N' : 'T'));
} else
*cp = ' '; /* restore the space !*/
fputs(buf,Ufile);
}
fclose(tfile);
fclose(Ufile);
return;
}
#ifdef MAILCMDS
/* scan the areaname.inf files for datestamps > m->last.
* these are areas that have new mail received since the user
* last logged in. - WG7J
*/
void listnewmail(struct mbx *m) {
char path[129];
struct ffblk sbuf;
#ifndef UNIX
struct ftime ft;
struct date dt;
struct time ti;
#endif
long t;
int rval;
int firstone;
int column;
/* set the path were the timestamp files live */
sprintf(path,"%s/*.inf",Mailspool);
/* find the first, if any */
rval = findfirst(path,&sbuf,0);
/* check them all */
firstone = 1;
column = 0;
while(rval != -1) {
/* get the timestamp */
#ifdef UNIX
t = mktime(&sbuf.ff_ftime);
#else
ft = *((struct ftime *)&sbuf.ff_ftime);
/* Now somehow translate this *&%#@ DOS format to unix timestamp */
dt.da_year = 1980 + ft.ft_year;
dt.da_mon = ft.ft_month;
dt.da_day = ft.ft_day;
ti.ti_hour = ft.ft_hour;
ti.ti_min = ft.ft_min;
ti.ti_sec = ft.ft_tsec;
ti.ti_hund = 0;
t = dostounix(&dt,&ti);
#endif
/* Is there new mail here ? */
if(m->last < t) {
/* cut off the extension */
*strchr(sbuf.ff_name,'.') = '\0';
if(firstone) {
tprintf("New mail in: %s ",sbuf.ff_name);
firstone = 0;
column = 2;
} else {
tprintf("%s ",sbuf.ff_name);
if(column++ == 6)
tputc('\n');
}
}
/* find next one */
rval = findnext(&sbuf);
}
if(!firstone)
tputc('\n');
return;
}
#endif /* USERLOG */
#endif MAILCMDS
int DiffUsers;
void
loguser(m)
struct mbx *m;
{
register struct pu *pu;
#ifdef USERLOG
FILE *Ufile;
char buf[256];
char *cp;
int found=0;
int xpert = 0;
#endif
if((pu = pu_lookup(m->name)) == NULLPU) { /* not 'known' user */
pu = (struct pu *)callocw(1,sizeof(struct pu));
strcpy(pu->name,m->name);
pu->next = Pu;
Pu = pu;
DiffUsers++; /* A new guy */
}
#ifdef notdef
pu->family = m->family;
#endif
pu->time = secclock();
pu->number++;
#ifdef USERLOG
/* Now get options from the userdefaults file, and add timestamp */
if(!(m->sid&MBX_SID)) { /* only if not a bbs */
sprintf(buf,"%s",UDefaults);
if ((Ufile = fopen(buf,"r+")) == NULLFILE) {
/* default file doesn't exist, create it */
if((Ufile = fopen(buf,"w")) == NULLFILE)
return;
/* Add this user as first one,
* default uses Area indication
*/
sprintf(buf,"%s 0 M%d A %c %c C%c\n",
m->name,m->morerows,
(m->sid&MBX_EXPERT) ? 'X' : ' ' ,
(m->sid&MBX_NRID) ? 'N' : ' ',
(m->family == AF_AX25) ? 'A' : \
((m->family == AF_NETROM) ? 'N' : 'T'));
fputs(buf,Ufile);
fclose(Ufile);
m->sid |= MBX_AREA;
m->last = 0L;
if(Usenrid)
m->sid |= MBX_NRID;
return;
}
/* Find user in the default file */
while(!found) {
if(fgets(buf,sizeof(buf),Ufile) == NULLCHAR)
break;
/* single out the name */
if((cp=strchr(buf,' ')) != NULLCHAR)
*cp++ = '\0';
/* compare the name */
if(!stricmp(m->name,buf)) {
/* found user, now scan the options used */
found = 1;
fclose(Ufile);
/* first read last login time */
m->last = atol(cp);
while(*cp != '\0') {
while(*cp == ' ') /*skip blanks*/
cp++;
switch(*cp){
case 'C':
/* All options end BEFORE the CT/CN or CA */
*(cp+1) = '\0';
break;
case 'M':
cp++;
m->morerows = atoi(cp);
break;
case 'A':
m->sid |= MBX_AREA;
break;
case 'X':
m->sid |= MBX_EXPERT;
xpert = 1;
break;
case 'N':
m->sid |= MBX_NRID;
break;
}
cp++;
}
}
} /* while(!found)*/
if(found) {
/* add the new timestamp to the defaults file */
if(!xpert)
m->sid &= ~MBX_EXPERT;
} else {
/* a new one, add to the end (where we now should be!)*/
m->last = 0L;
sprintf(buf,"%s 0 M%d A %c %c C%c\n",
m->name,m->morerows,
(m->sid & MBX_EXPERT) ? 'X' : ' ' ,
(Usenrid) ? 'N' : ' ' ,
(m->family == AF_AX25) ? 'A' : \
((m->family == AF_NETROM) ? 'N' : 'T'));
fputs(buf,Ufile);
fclose(Ufile);
m->sid |= MBX_AREA;
if(Usenrid)
m->sid |= MBX_NRID;
}
}/* if not bbs */
#endif /* USERLOG */
}
/*List all past users of the mailbox */
static int
dombpast(argc,argv,p)
int argc;
char *argv[];
void *p;
{
register struct pu *pu;
int col = 0;
int max=10000; /* Large enough :-) */
int count=0;
if(argc>1)
max = atoi(argv[1])-1;
tputs("Past users:\n"
"User Logins Time since last "
"User Logins Time since last\n");
for (pu=Pu;pu!=NULLPU;pu=pu->next) {
if(col)
tputs(" : ");
tprintf("%-10s %-4d %12s",pu->name,pu->number,\
tformat(secclock() - pu->time));
count++;
if(count>max)
break;
if(col) {
col = 0;
tputc('\n');
} else
col = 1;
}
if(col)
tputc('\n');
tputc('\n');
return 0;
}
int
dombmailstats(argc,argv,p)
int argc;
char *argv[];
void *p;
{
#ifdef UNIX
tprintf("Up: %s\n"
"Logins: %d\n"
"Users: %d\n"
"Count: %d\n",
tformat(secclock()),Totallogins,BbsUsers,DiffUsers);
#else
tprintf("Core: %lu\n"
"Up: %s\n"
"Logins: %d\n"
"Users: %d\n"
"Count: %d\n",
farcoreleft(),tformat(secclock()),Totallogins,BbsUsers,DiffUsers);
#endif
#ifdef MAILCMDS
#ifdef MBFWD
tprintf("Sent: %d\n"
"Read: %d\n"
"Rcvd: %d\n"
"Fwd: %d\n\n",\
MbSent,MbRead,MbRecvd,MbForwarded);
#else
tprintf("Sent: %d\n"
"Read: %d\n"
"Rcvd: %d\n\n",MbSent,MbRead,MbRecvd);
#endif
#endif
return 0;
}
#ifdef USERLOG
/* Search for info on a certain user in the users.dat file */
int
dombuserinfo(argc,argv,p)
int argc;
char *argv[];
void *p;
{
FILE *Ufile;
char buf[MBXLINE];
int found = 0;
time_t t;
struct tm *lt;
char *cp;
char *cp2;
cp2 = "TELNET";
if((Ufile = fopen(UDefaults,"r")) == NULLFILE) {
tputs("Can't find user data\n");
return 0;
}
while( !found && (fgets(buf,MBXLINE,Ufile) != NULLCHAR) ) {
if((cp=strchr(buf,' ')) != NULLCHAR)
*cp = '\0';
if(!stricmp(buf,argv[1])) { /* Found it ! */
t = atol(++cp);
lt = localtime(&t);
if((cp = strchr(cp,'C'))!=NULLCHAR) {
cp++;
/* How was the connection made ? */
switch(*cp) {
case 'A':
cp2 = "AX.25";
break;
case 'N':
cp2 = "NETROM";
break;
}
}
tprintf("%s last connected via %s on %s",argv[1],cp2,asctime(lt));
found = 1;
}
}
if(!found)
tprintf("%s never connected\n",argv[1]);
fclose(Ufile);
return 0;
}
#endif
int
dombusers(argc,argv,p)
int argc;
char *argv[];
void *p;
{
register struct mbx *m,*caller;
int len;
char *cp, *cp1, fsocket[MAXSOCKSIZE];
char upl[40], down[40];
struct usock *up, *up1;
int s;
#ifdef NETROM
struct nrroute_tab *np;
char temp[AXBUF], *cp2, *cp3;
#endif
caller = (struct mbx *) p;
if(caller->stype == 'S')
return dombmailstats(argc,argv,p);
#ifdef MAILCMDS
if(caller->stype == 'M' && (caller->privs & SYSOP_CMD))
return dombmovemail(argc,argv,p);
#endif
if(caller->stype == 'L')
#ifdef USERLOG
if((argc > 1) && (atoi(argv[1]) == 0))
return dombuserinfo(argc,argv,p);
else
#endif
return dombpast(argc,argv,p);
tputs("Users:\n");
for(m=Mbox;m;m=m->next) {
len = MAXSOCKSIZE;
getpeername(m->user,fsocket,&len);
cp = strdup(psocket(fsocket));
upl[0] = '\0';
down[0] = '\0';
switch(m->family) { /* UPLINK */
#ifdef AX25
case AF_AX25:
sprintf(upl,Uplink,cp);
break;
#endif
#ifdef NETROM
case AF_NETROM:
if((cp1 = strchr(cp,' ')) != NULLCHAR)
*cp1 = '\0';
cp1 += 3;
setcall(temp,cp1);
np = find_nrroute(temp);
cp2 = strdup(np->alias);
if((cp3 = strchr(cp2,' ')) != NULLCHAR)
*cp3 = '\0';
/*
if(*cp2 == '#' || *cp2 == '\0')
sprintf(upl,incircuit,"","",cp1,cp);
else
*/
/* show correct user name when outgoing forward over netrom
* problem caused by use of the '.C xxx' lines.
*/
if(m->state == MBX_TRYING || m->state == MBX_FORWARD)
sprintf(upl,incircuit,cp2,":",cp1,m->name);
else
sprintf(upl,incircuit,cp2,":",cp1,cp);
free(cp2);
break;
#endif
case AF_INET:
if((cp1 = strchr(cp,':')) != NULLCHAR)
*cp1 = '\0';
sprintf(upl,Telnet,m->name,cp);
break;
case AF_LOCAL:
sprintf(upl,Local,Hostname);
break;
default:
strcpy(upl,"Connect");
break;
}
free(cp);
tprintf("%-36s",upl);
/* Now show what they are doing - WG7J */
if(m->state != MBX_GATEWAY)
tputs(" -> ");
switch(m->state){
case MBX_GATEWAY:
for(s = SOCKBASE; s < Nusock + SOCKBASE; s++) {
if((up = itop(s)) == NULLUSOCK || s == m->user)
continue;
up1 = itop(m->user);
if(up->owner == up1->owner) {
getpeername(s,fsocket,&len);
cp = strdup(psocket(fsocket));
switch(up->type) {
case TYPE_TCP:
#ifdef notdef
if((cp1 = strchr(cp,':')) != NULLCHAR)
*cp1 = '\0';
#endif
sprintf(down,Telnetdown,cp);
break;
#ifdef AX25
case TYPE_AX25I:
/*
if((cp1 = strchr(cp,' ')) != NULLCHAR)
*cp1 = '\0';
*/
sprintf(down,Downlink,cp);
break;
#endif
#ifdef NETROM
case TYPE_NETROML4:
/*get rid of usercall*/
if((cp1 = strchr(cp,' ')) != NULLCHAR)
*cp1 = '\0';
cp1 += 3; /*get rid of ' @ '*/
setcall(temp,cp1); /*get node call*/
np = find_nrroute(temp);/*find alias, if any*/
cp2 = strdup(np->alias);
if((cp3 = strchr(cp2,' ')) != NULLCHAR)
*cp3 = '\0';
/*
memcpy(cp,m->call,AXALEN);
cp[ALEN] ^= 0x1e;
*/
/*
if(*cp2 == '#' || *cp2 == '\0')
sprintf(down,outcircuit,"","",cp1);
else
*/
sprintf(down,outcircuit,cp2,":",cp1);
free(cp2);
break;
#endif
case TYPE_LOCAL_STREAM:
case TYPE_LOCAL_DGRAM:
sprintf(down,Local,Hostname);
break;
default:
strcpy(down,"Connect");
break;
}
free(cp);
tprintf("<--> %s\n",down);
break;
}
}
break;
case MBX_LOGIN:
tputs("Logging in\n");
break;
case MBX_CMD:
tputs("Idle\n");
break;
#ifdef MAILCMDS
case MBX_SUBJ:
case MBX_DATA:
tputs("Sending message\n");
break;
#ifdef MBFWD
case MBX_REVFWD:
tputs("Reverse Forwarding\n");
break;
case MBX_TRYING:
tputs("Attempting Forward\n");
break;
case MBX_FORWARD:
tputs("Forwarding\n");
break;
#endif
case MBX_READ:
tputs("Reading message\n");
break;
#endif
case MBX_UPLOAD:
tputs("Uploading file\n");
break;
case MBX_DOWNLOAD:
tputs("Downloading file\n");
break;
#ifdef CONVERS
case MBX_CONVERS:
tputs("Convers mode\n");
break;
#endif
case MBX_CHAT:
tputs("Chatting with sysop\n");
break;
case MBX_WHAT:
tputs("Listing files\n");
break;
#ifdef XMODEM
case MBX_XMODEM_RX:
tputs("Xmodem Receiving\n");
break;
case MBX_XMODEM_TX:
tputs("Xmodem Sending\n");
break;
#endif
}
/* Only show callers with sysop-privs who is sysop-mode!
* This prevents users from easily learning who's
* got SYSOP privs
*/
if(m->state == MBX_SYSOPTRY) {
if(caller->privs & SYSOP_CMD)
tputs("Attempting Sysop mode\n");
else
tputs("Idle\n");
} else {
if(m->state == MBX_SYSOP) {
if(caller->privs & SYSOP_CMD)
tputs("Sysop mode\n");
else
tputs("Idle\n");
}
}
}
tputc('\n');
return 0;
}
#ifdef MBFWD
static int
dombtrace(argc,argv,p)
int argc;
char *argv[];
void *p;
{
return setbool(&Mtrace,"Mailbox trace flag",argc,argv);
}
#endif
static int
dombsecure(argc,argv,p)
int argc;
char *argv[];
void *p;
{
return setbool(&MBSecure,"Mailbox gateway secure flag",argc,argv);
}
#ifdef CALLBOOK
char *InetCallserver = NULLCHAR;
char *InetCallserverport = NULLCHAR;
int
doinetcallserver(argc,argv,p)
int argc;
char *argv[];
void *p;
{
if(argc == 1) {
if(InetCallserver != NULLCHAR) {
tprintf("Server %s, on port %s\n",InetCallserver,InetCallserverport);
} else
tputs("Not set!\n");
return 0;
}
if(argc == 2) {
tputs("Usage: callserver <host> <port>\n");
return 0;
}
/*Check validity of the parameters*/
if(resolve(argv[1]) == (int32) 0) {
tprintf(Badhost,argv[1]);
return 0;
}
if(atoi(argv[2]) == (int) 0) {
tprintf("Bad port %s\n",argv[2]);
return 0;
}
if(InetCallserver != NULLCHAR) {
free(InetCallserver);
free(InetCallserverport);
}
InetCallserver = strdup(argv[1]);
InetCallserverport = strdup(argv[2]);
return 0;
}
#endif /* CALLBOOK */
static int
dombnoax25(argc,argv,p)
int argc;
char *argv[];
void *p;
{
return setflag(argc,argv[1],NO_AX25,argv[2]);
}
static int
dombbonly(argc,argv,p)
int argc;
char *argv[];
void *p;
{
return setflag(argc,argv[1],BBS_ONLY,argv[2]);
}
static int
dombuonly(argc,argv,p)
int argc;
char *argv[];
void *p;
{
return setflag(argc,argv[1],USERS_ONLY,argv[2]);
}
static int
dombsonly(argc,argv,p)
int argc;
char *argv[];
void *p;
{
return setflag(argc,argv[1],SYSOP_ONLY,argv[2]);
}
#endif /* MAILBOX */